using `forward-line' instead. It is usually easier to use
and more reliable (no dependence on goal column, etc.)."
(interactive "p")
- (let ((opoint (point)))
- (if next-line-add-newlines
- (if (/= arg 1)
- (line-move arg)
- (forward-line 1)
- (if (or (= opoint (point)) (not (eq (preceding-char) ?\n)))
- (insert ?\n)
- (goto-char opoint)
- (line-move arg)))
- (if (eobp)
- (signal 'end-of-buffer nil))
- (line-move arg)
- (if (= opoint (point))
- (end-of-line))))
+ (if (and next-line-add-newlines (= arg 1))
+ (let ((opoint (point)))
+ (forward-line 1)
+ (if (or (= opoint (point)) (not (eq (preceding-char) ?\n)))
+ (insert ?\n)
+ (goto-char opoint)
+ (line-move arg)))
+ (line-move arg))
nil)
(defun previous-line (arg)
When the `track-eol' feature is doing its job, the value is 9999.")
(defun line-move (arg)
- (if (not (or (eq last-command 'next-line)
- (eq last-command 'previous-line)))
- (setq temporary-goal-column
- (if (and track-eol (eolp)
- ;; Don't count beg of empty line as end of line
- ;; unless we just did explicit end-of-line.
- (or (not (bolp)) (eq last-command 'end-of-line)))
- 9999
- (current-column))))
- (if (not (integerp selective-display))
- (forward-line arg)
- ;; Move by arg lines, but ignore invisible ones.
- (while (> arg 0)
- (vertical-motion 1)
- (forward-char -1)
- (forward-line 1)
- (setq arg (1- arg)))
- (while (< arg 0)
- (vertical-motion -1)
- (beginning-of-line)
- (setq arg (1+ arg))))
- (move-to-column (or goal-column temporary-goal-column))
- nil)
+ (let ((signal
+ (catch 'exit
+ (if (not (or (eq last-command 'next-line)
+ (eq last-command 'previous-line)))
+ (setq temporary-goal-column
+ (if (and track-eol (eolp)
+ ;; Don't count beg of empty line as end of line
+ ;; unless we just did explicit end-of-line.
+ (or (not (bolp)) (eq last-command 'end-of-line)))
+ 9999
+ (current-column))))
+ (if (not (integerp selective-display))
+ (or (and (zerop (forward-line arg))
+ (bolp))
+ (throw 'exit (if (bobp)
+ 'beginning-of-buffer
+ 'end-of-buffer)))
+ ;; Move by arg lines, but ignore invisible ones.
+ (while (> arg 0)
+ (end-of-line)
+ (and (zerop (vertical-motion 1))
+ (throw 'exit 'end-of-buffer))
+ (setq arg (1- arg)))
+ (while (< arg 0)
+ (beginning-of-line)
+ (and (zerop (vertical-motion -1))
+ (throw 'exit 'beginning-of-buffer))
+ (setq arg (1+ arg))))
+ (move-to-column (or goal-column temporary-goal-column))
+ nil)))
+ (cond
+ ((eq signal 'beginning-of-buffer)
+ (message "Beginning of buffer")
+ (ding))
+ ((eq signal 'end-of-buffer)
+ (message "End of buffer")
+ (ding)))))
;;; Many people have said they rarely use this feature, and often type
;;; it by accident. Maybe it shouldn't even be on a key.